package com.atguigu.tingshu.album.service.impl;

import com.atguigu.tingshu.album.mapper.AlbumAttributeValueMapper;
import com.atguigu.tingshu.album.mapper.AlbumInfoMapper;
import com.atguigu.tingshu.album.mapper.AlbumStatMapper;
import com.atguigu.tingshu.album.service.AlbumInfoService;
import com.atguigu.tingshu.common.constant.SystemConstant;
import com.atguigu.tingshu.common.rabbit.constant.MqConst;
import com.atguigu.tingshu.common.rabbit.service.RabbitService;
import com.atguigu.tingshu.common.util.AuthContextHolder;
import com.atguigu.tingshu.model.album.AlbumAttributeValue;
import com.atguigu.tingshu.model.album.AlbumInfo;
import com.atguigu.tingshu.model.album.AlbumStat;
import com.atguigu.tingshu.query.album.AlbumInfoQuery;
import com.atguigu.tingshu.vo.album.AlbumAttributeValueVo;
import com.atguigu.tingshu.vo.album.AlbumInfoVo;
import com.atguigu.tingshu.vo.album.AlbumListVo;
import com.atguigu.tingshu.vo.album.AlbumStatVo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;



import java.util.List;


@Slf4j
@Service
@SuppressWarnings({"all"})
public class AlbumInfoServiceImpl extends ServiceImpl<AlbumInfoMapper, AlbumInfo> implements AlbumInfoService {

    @Autowired
    private AlbumInfoMapper albumInfoMapper;

    @Autowired
    private AlbumAttributeValueMapper albumAttributeValueMapper;

    @Autowired
    private AlbumStatMapper albumStatMapper;

    @Autowired
    private RabbitService rabbitService;

    @Override
    public void saveAlbumInfo(AlbumInfoVo albumInfoVo) {
        // 初始化AlbumInfo对象
        AlbumInfo albumInfo = new AlbumInfo();
        // 复制VO中的属性到AlbumInfo对象
        BeanUtils.copyProperties(albumInfoVo, albumInfo);
        Long userId = AuthContextHolder.getUserId() == null ? 1L : AuthContextHolder.getUserId();
        albumInfo.setUserId(userId);
        albumInfo.setStatus(SystemConstant.ALBUM_STATUS_PASS);
        // 如果支付类型为免费，则设置免费曲目数量为5
        if (SystemConstant.ALBUM_PAY_TYPE_FREE.equals(albumInfo.getPayType())) {
            albumInfo.setTracksForFree(5);
        }
        this.save(albumInfo);

        // 获取专辑属性值列表
        List<AlbumAttributeValueVo> albumAttributeValueVoList = albumInfoVo.getAlbumAttributeValueVoList();
        if (!CollectionUtils.isEmpty(albumAttributeValueVoList)) {
            // 遍历列表，复制属性值并关联专辑ID后保存
            albumAttributeValueVoList.stream().forEach(albumAttributeValueVo -> {
                AlbumAttributeValue albumAttributeValue = new AlbumAttributeValue();
                BeanUtils.copyProperties(albumAttributeValueVo, albumAttributeValue);
                albumAttributeValue.setAlbumId(albumInfo.getId());
                albumAttributeValueMapper.insert(albumAttributeValue);
            });

            // 为专辑保存各种统计类型
            this.saveStatType(albumInfo.getId(), SystemConstant.ALBUM_STAT_PLAY);
            this.saveStatType(albumInfo.getId(), SystemConstant.ALBUM_STAT_SUBSCRIBE);
            this.saveStatType(albumInfo.getId(), SystemConstant.ALBUM_STAT_BROWSE);
            this.saveStatType(albumInfo.getId(), SystemConstant.ALBUM_STAT_COMMENT);

            if ("1".equals(albumInfoVo.getIsOpen())){
                rabbitService.sendMessage(MqConst.EXCHANGE_ALBUM, MqConst.ROUTING_ALBUM_UPPER, albumInfo.getId());
            }else {
                rabbitService.sendMessage(MqConst.EXCHANGE_ALBUM, MqConst.ROUTING_ALBUM_LOWER,  albumInfo.getId());
            }
        }
    }

    /*
     * 保存专辑信息
     * */
    private void saveStatType(Long albumId, String statType) {
        AlbumStat albumStat = new AlbumStat();
        albumStat.setAlbumId(albumId);
        albumStat.setStatType(statType);
        albumStat.setStatNum(0);
        albumStatMapper.insert(albumStat);
    }


    /*
     * 查看专辑列表
     * */
    @Override
    public IPage<AlbumListVo> getAlbumList(Page<AlbumListVo> albumListVoPage, AlbumInfoQuery albumInfoQuery) {
        return albumInfoMapper.getAlbumList(albumListVoPage, albumInfoQuery);
    }

    /*
     *   根据id删除专辑
     * */
    @Override
    public void removeAlbumInfoById(Long albumId) {
        // 删除基础专辑信息  album_info
        albumInfoMapper.deleteById(albumId);
        // 删除与该专辑关联的所有属性值  album_attribute_value
        albumAttributeValueMapper.delete(new LambdaQueryWrapper<AlbumAttributeValue>().eq(AlbumAttributeValue::getAlbumId, albumId));
        // 删除该专辑的统计信息   album_stat
        albumStatMapper.delete(new LambdaQueryWrapper<AlbumStat>().eq(AlbumStat::getAlbumId, albumId));

        rabbitService.sendMessage(MqConst.EXCHANGE_ALBUM, MqConst.ROUTING_ALBUM_LOWER, albumId);
    }

    /*
     *   根据id查询专辑信息
     * */
    @Override
    public AlbumInfo getAlbumInfo(Long albumId) {
        AlbumInfo albumInfo = albumInfoMapper.selectById(albumId);
        if (albumInfo != null){
            List<AlbumAttributeValue> albumAttributeValues = albumAttributeValueMapper.selectList(new LambdaQueryWrapper<AlbumAttributeValue>().eq(AlbumAttributeValue::getAlbumId, albumId));
            albumInfo.setAlbumAttributeValueVoList(albumAttributeValues);
        }
        return albumInfo;
    }

   /*
   * 根据专辑albumId修改专辑信息
   * */
    @Override
    public void updateAlbumInfo(Long albumId, AlbumInfoVo albumInfoVo) {
        // 通过专辑ID获取现有的专辑信息
        AlbumInfo albumInfo = this.getById(albumId);
        // 将视图对象中的属性值复制到现有的专辑信息对象中
        BeanUtils.copyProperties(albumInfoVo,albumInfo);

        // 更新专辑信息
        this.updateById(albumInfo);
        // 删除该专辑的所有属性值
        albumAttributeValueMapper.delete(new LambdaQueryWrapper<AlbumAttributeValue>().eq(AlbumAttributeValue::getAlbumId,albumId));

        // 获取更新后的专辑属性值列表
        List<AlbumAttributeValueVo> albumAttributeValueVoList = albumInfoVo.getAlbumAttributeValueVoList();
        if (!CollectionUtils.isEmpty(albumAttributeValueVoList)){
            // 创建新的专辑属性值对象
            AlbumAttributeValue albumAttributeValue = new AlbumAttributeValue();
            // 将列表中的属性值复制到新的专辑属性值对象中
            BeanUtils.copyProperties(albumAttributeValueVoList,albumAttributeValue);
            albumAttributeValue.setAlbumId(albumId);
            // 插入新的专辑属性值
            albumAttributeValueMapper.insert(albumAttributeValue);
        }
        if ("1".equals(albumInfoVo.getIsOpen())){
            rabbitService.sendMessage(MqConst.EXCHANGE_ALBUM, MqConst.ROUTING_ALBUM_UPPER, albumId);
        }else {
            rabbitService.sendMessage(MqConst.EXCHANGE_ALBUM, MqConst.ROUTING_ALBUM_LOWER, albumId);
        }
    }

    /*
    * 获取当前用户全部专辑列表
    * */
    @Override
    public List<AlbumInfo> findUserAllAlbumList(Long userId) {
        List<AlbumInfo> albumInfoList = albumInfoMapper.selectList(new LambdaQueryWrapper<AlbumInfo>().eq(AlbumInfo::getUserId, userId).select(AlbumInfo::getAlbumTitle, AlbumInfo::getId).last("limit 100"));
        return albumInfoList;
    }

    /*
    * 根据专辑id获取专辑属性列表
    * */
    @Override
    public List<AlbumAttributeValue> findAlbumAttributeValue(Long albumId) {
        return albumAttributeValueMapper.selectList(new LambdaQueryWrapper<AlbumAttributeValue>().eq(AlbumAttributeValue::getAlbumId,albumId));
    }


    /*
    * 根据专辑id获取统计信息
    * */
    @Override
    public AlbumStatVo getAlbumStatVo(Long albumId) {
        return albumInfoMapper.getAlbumStatVo(albumId);
    }
}
